React Hooks
1. React Hooks 是什么?
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性
2. React Hooks特点
- 完全可选: 你无需重写任何已有代码就可以在一些组件中尝试 Hook。但是如果你不想,你不必现在就去学习或使用 Hook。
- 100% 向后兼容的。 Hook 不包含任何破坏性改动。
- 现在可用。 Hook 已发布于 v16.8.0。
- 没有计划从 React 中移除 class
- Hook 不会影响你对 React 概念的理解
3. React Hooks作用 【 为什么要使用Hooks 】
- 解决在组件之间复用状态逻辑很难
- 解决复杂组件变得难以理解
- 解决难以理解的 class
4. React Hooks 有哪些?
- 基础 Hook
- useState
- 返回一个 state,以及更新 state 的函数。
- useEffect
- 该 Hook 接收一个包含命令式、且可能有副作用代码的函数
- useContext
- 接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值
- useState
- 额外的 Hook
- useReducer
- useState 的替代方案。它接收一个形如 (state, action) => newState 的 reducer,并返回当前的 state 以及与其配套的 dispatch 方法
- useCallback
- 返回一个 memoized 回调函数
- useMemo
- 返回一个 memoized 值
- useRef
- useRef 返回一个可变的 ref 对象
- useImperativeHandle
- useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值
- useLayoutEffect
- 其函数签名与 useEffect 相同,但它会在所有的 DOM 变更之后同步调用 effect。可以使用它来读取 DOM 布局并同步触发重渲染。在浏览器执行绘制之前,useLayoutEffect 内部的更新计划将被同步刷新。
- useDebugValue
- useDebugValue 可用于在 React 开发者工具中显示自定义 hook 的标签。
- useReducer
5. 简单使用一下几个常用React Hooks
useState - 代码演示 function Counter({initialCount}) {
const [count, setCount] = useState(initialCount);
/*
* count 是定义的state
* setCount 是用于更新count的方法
*/
return (
<div>
Count: {count}
<button onClick={() => setCount(initialCount)}>Reset</button>
<button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
<button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
</div>
);
}
useEffect - 代码演示
在函数组件主体内(这里指在 React 渲染阶段)改变 DOM、添加订阅、设置定时器、记录日志以及执行其他包含副作用的操作都是不被允许的,因为这可能会产生莫名其妙的 bug 并破坏 UI 的一致性。 useEffect提供了这些副作用操作的可能
function Counter({initialCount}) {
const [count, setCount] = useState(initialCount);
/*
* count 是定义的state
* setCount 是用于更新count的方法
*/
return (
<div>
Count: {count}
<button onClick={() => setCount(initialCount)}>Reset</button>
<button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
<button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
</div>
);
}
useContext - 代码演示
- useContext(MyContext) 相当于 class 组件中的 static contextType = MyContext
- useContext(MyContext) 只是让你能够读取 context 的值以及订阅 context 的变化。你仍然需要在上层组件树中使用
来为下层组件提供 context
import React from 'react'
const themes = {
light: {
foreground: "#000000",
background: "#eeeeee"
},
dark: {
foreground: "#ffffff",
background: "#222222"
}
};
const ThemeContext = React.createContext(themes.light);
function App() {
return (
<ThemeContext.Provider value={themes.dark}>
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar(props) {
return (
<div>
<ThemedButton />
</div>
);
}
function ThemedButton() {
const theme = useContext(ThemeContext);
const style = { background: theme.background, color: theme.foreground }
return (
<button style={ style }>
I am styled by theme context!
</button>
);
}